home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Internet Tools 1993 July / Internet Tools.iso / RockRidge / security / xinetd / xinetd.2.0.6 / exit.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-01-22  |  2.7 KB  |  129 lines

  1. /*
  2.  * (c) Copyright 1992 by Panagiotis Tsirigotis
  3.  * All rights reserved.  The file named COPYRIGHT specifies the terms 
  4.  * and conditions for redistribution.
  5.  */
  6.  
  7. static char RCSid[] = "$Id: exit.c,v 5.1 1992/11/01 00:01:21 panos Exp $" ;
  8.  
  9. #include <sys/types.h>
  10. #include <sys/time.h>
  11. #include <sys/resource.h>
  12. #include <sys/wait.h>
  13. #include <syslog.h>
  14. #include <errno.h>
  15.  
  16. #include "pset.h"
  17.  
  18. #include "server.h"
  19. #include "state.h"
  20.  
  21. void msg() ;
  22.  
  23. void child_exit()
  24. {
  25.     struct server *find_server() ;
  26.     void server_exit() ;
  27.     char *func = "child_exit" ;
  28.  
  29.     for ( ;; )                /* Find all children that exited */
  30.     {
  31.         int status ;
  32.         register int pid ;
  33.         struct server *serp ;
  34.         
  35. #if defined( sun ) && defined( lint )
  36.         pid = wait3( (union wait *)&status, WNOHANG, RUSAGE_NULL ) ;
  37. #else
  38.         pid = wait3( &status, WNOHANG, RUSAGE_NULL ) ;
  39. #endif
  40.  
  41.         if ( debug.on )
  42.             msg( LOG_DEBUG, func, "wait3 returned = %d", pid ) ;
  43.         
  44.         if ( pid == -1 )
  45.             if ( errno == EINTR )
  46.                 continue ;
  47.             else
  48.                 break ;
  49.  
  50.         if ( pid == 0 )
  51.             break ;
  52.         
  53.         if ( ( serp = find_server( pid ) ) != NULL )
  54.         {
  55.             serp->exit_status = status ;
  56.             server_exit( serp ) ;
  57.         }
  58.         else
  59.             msg( LOG_NOTICE, func, "unknown child process %d %s", pid,
  60.                 PROC_STOPPED( status ) ? "stopped" : "died" ) ;
  61.     }
  62. }
  63.  
  64.  
  65.  
  66. PRIVATE void server_exit( serp )
  67.     struct server *serp ;
  68. {
  69.     struct service *sp = SERVER_SERVICE( serp ) ;
  70.     struct service_config *scp = CONF( sp ) ;
  71.     register struct service_data *sdp = SDATA( sp ) ;
  72.     char *func = "server_exit" ;
  73.  
  74.     if ( PROC_EXITED( serp->exit_status ) || PROC_SIGNALED( serp->exit_status ) )
  75.     {
  76.         char *death_type = PROC_EXITED( serp->exit_status ) ? "exited" : "died" ;
  77.  
  78.         if ( debug.on )
  79.         {
  80.             struct service *conn_sp = SERVER_CONNECTION( serp )->sp ;
  81.  
  82.             if ( conn_sp == sp )
  83.                 msg( LOG_DEBUG, func,
  84.                     "%s server %d %s", scp->id, serp->pid, death_type ) ;
  85.             else
  86.                 msg( LOG_DEBUG, func,
  87.                     "%s server %d running on behalf of service %s %s",
  88.                         scp->id, serp->pid, CONF( conn_sp )->id, death_type ) ;
  89.         }
  90.         
  91.         if ( sdp->postmortem != NULL )
  92.             (*sdp->postmortem)( serp ) ;
  93.  
  94.         if ( sdp->running_servers > 0 )
  95.             sdp->running_servers-- ;
  96.         else
  97.             msg( LOG_ERR, func,
  98.                 "Service %s: server exit with 0 running servers", scp->id ) ;
  99.  
  100.         pset_remove( ps.rws.servers, serp ) ;
  101.  
  102.         server_release( serp ) ;
  103.     }
  104.     else if ( PROC_STOPPED( serp->exit_status ) )
  105.         msg( LOG_WARNING, func,
  106.                 "service %s: server with pid %d stopped", scp->id, serp->pid ) ;
  107. }
  108.  
  109.  
  110. /*
  111.  * Find the running server with the specified pid
  112.  */
  113. PRIVATE struct server *find_server( pid )
  114.     register int pid ;
  115. {
  116.     register unsigned u ;
  117.  
  118.     for ( u = 0 ; u < pset_count( ps.rws.servers ) ; u++ )
  119.     {
  120.         register struct server *serp ;
  121.         
  122.         serp = SERP( pset_pointer( ps.rws.servers, u ) ) ;
  123.         if ( serp->pid == pid )
  124.             return( serp ) ;
  125.     }
  126.     return( NULL ) ;
  127. }
  128.  
  129.